﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections.Specialized;

namespace LANmine
{
    public partial class EditUser : Form
    {
        
        private Language lmLang;
        //private User lmUser;
        //private String[] langKeys;

        //Het declaratie wordt hier gebeurd zodat ik deze variabele in meerdere functies kan gebruiken
        Database dbDeelnemers;
        SqlConnection dbConn;
        SqlDataAdapter daDeelnemers;
        DataSet dsDeelnemers;
        DataTable dtDeelnemers;


        //public EditUser(Language lmLang, User lmUser)
        //{
        //    /** Save the language and user objects */
        //    this.lmLang = lmLang;
        //    this.lmUser = lmUser;



        //    InitializeComponent();
        //    loadDeelnemers();
        //}

       
         public EditUser(Language lmLang)
        {
            this.lmLang = lmLang;
            

            InitializeComponent();
            ApplyLanguage();
            LoadDeelnemers();
        }
        


        //die constructor neemt een Language-object aan en als ge die constructor oproept dan doet em eerst EditUser()
        //waar InitializeComponents in staat
        //public EditUser(Language lmLang) : this()
        //{
           
        //    ApplyLanguage();
        //    LoadDeelnemers();
        //}


        #region Language Specifications
        /**
         * MainForm::ApplyLanguage()
         * ---------------------------
         * Overwrite all text properties of all elements in all forms with the right ones.
         */
        private void ApplyLanguage()
        {
            lblFirstName.Text = this.lmLang.GetString("adminUser.lblFirstName");
            lblName.Text = this.lmLang.GetString("adminUser.lblName");
            lblUsername.Text = this.lmLang.GetString("adminUser.lblUsername");
            lblPassword.Text = this.lmLang.GetString("adminUser.lblPassword");
            lblBetaald.Text = this.lmLang.GetString("adminUser.lblBetaald");
            lblCredits.Text = this.lmLang.GetString("adminUser.lblCredits");
            lblStaff.Text = this.lmLang.GetString("adminUser.lblStaff");
            lblEmail.Text = this.lmLang.GetString("adminUser.lblEmail");
            lblLanguage.Text = this.lmLang.GetString("adminUser.lblLanguage");
            lblCheckedIn.Text = this.lmLang.GetString("adminUser.lblCheckedIn");


            chbBetaald.Text = this.lmLang.GetString("adminUser.chbBetaald");
            chbStaff.Text = this.lmLang.GetString("adminUser.chbStaff");
            chbCheckedIn.Text = this.lmLang.GetString("adminUser.chbCheckedIn");

            btnNewUser.Text = this.lmLang.GetString("adminUser.btnNewUser");
            btnSaveAdd.Text = this.lmLang.GetString("adminUser.btnSaveAdd");
            btnSaveEdit.Text = this.lmLang.GetString("adminUser.btnSaveEdit");

        }
        #endregion



        private void LoadDeelnemers()
        {
            //connectie creeren , rw= read write
            dbDeelnemers = new Database("rw");
            dbConn = dbDeelnemers.getDbConn();

            //Dataadapter --> liasion avec le database
            daDeelnemers = new SqlDataAdapter("Select * From deelnemers", dbConn);

            //Hier zijn de datatabels gestokeerd
            dsDeelnemers = new DataSet("deelnemers");

            //dataadapter bestaat uit verschillende datatabels en hier maakt die een schema deelnemers en dataset bestaat uit verschillende datatabels en dataadapters en deze v
            daDeelnemers.FillSchema(dsDeelnemers, SchemaType.Source, "deelnemers");
            daDeelnemers.Fill(dsDeelnemers, "deelnemers");

            //tabel met gegevens van de database
            
            dtDeelnemers = dsDeelnemers.Tables["deelnemers"];

            lbxDeelnemers.DisplayMember = "Title";

            foreach (DataRow r in dtDeelnemers.Rows)
            {
                UInt32 uId = Convert.ToUInt32(r["id"].ToString());

                ListBoxItem newItem = new ListBoxItem(uId, r["naam"].ToString() + " " + r["voornaam"].ToString());
                lbxDeelnemers.Items.Add(newItem);
            }

            //om bij het openen van het form een geselecteerd item te hebben
            lbxDeelnemers.SelectedIndex = 0;
        }

        //het functie gaat na welke item is geselecteerd en geef een bepaald informatie daarvan.
        private void LoadDeelnemer()
        {
            txtFirstname.Text = dtDeelnemers.Rows[lbxDeelnemers.SelectedIndex]["voornaam"].ToString();
            txtName.Text = dtDeelnemers.Rows[lbxDeelnemers.SelectedIndex]["naam"].ToString();
            txtUsername.Text = dtDeelnemers.Rows[lbxDeelnemers.SelectedIndex]["gebruikersnaam"].ToString();
            //txtPassword.Text = dtDeelnemers.Rows[lbxDeelnemers.SelectedIndex]["wachtwoord"].ToString();
            chbBetaald.Checked = bool.Parse(dtDeelnemers.Rows[lbxDeelnemers.SelectedIndex]["betaald"].ToString());
            txtCredits.Text = dtDeelnemers.Rows[lbxDeelnemers.SelectedIndex]["credits"].ToString();
            chbStaff.Checked = bool.Parse(dtDeelnemers.Rows[lbxDeelnemers.SelectedIndex]["staff"].ToString());
            txtEmail.Text = dtDeelnemers.Rows[lbxDeelnemers.SelectedIndex]["email"].ToString();
            cboLanguage.Text = dtDeelnemers.Rows[lbxDeelnemers.SelectedIndex]["taal"].ToString();
            chbCheckedIn.Checked = bool.Parse(dtDeelnemers.Rows[lbxDeelnemers.SelectedIndex]["checkedin"].ToString());

        }

        //creatie van een nieuwe user of aanpassing van een user , en deze wordt verstuurd naar de datatable
        private void UpdateDeelnemer()
        {
            dtDeelnemers.Rows[lbxDeelnemers.SelectedIndex]["voornaam"]= txtFirstname.Text;
            dtDeelnemers.Rows[lbxDeelnemers.SelectedIndex]["naam"] = txtName.Text;
            dtDeelnemers.Rows[lbxDeelnemers.SelectedIndex]["gebruikersnaam"] = txtUsername.Text ;
            if (txtPassword.Text.Length > 0)
                dtDeelnemers.Rows[lbxDeelnemers.SelectedIndex]["wachtwoord"] = Login.HashCode(txtPassword.Text);
            dtDeelnemers.Rows[lbxDeelnemers.SelectedIndex]["betaald"] = chbBetaald.Checked.ToString();
            dtDeelnemers.Rows[lbxDeelnemers.SelectedIndex]["credits"] = txtCredits.Text;
            dtDeelnemers.Rows[lbxDeelnemers.SelectedIndex]["staff"] = chbStaff.Checked.ToString() ;
            dtDeelnemers.Rows[lbxDeelnemers.SelectedIndex]["email"] = txtEmail.Text ;
            dtDeelnemers.Rows[lbxDeelnemers.SelectedIndex]["taal"] = cboLanguage.Text;
            dtDeelnemers.Rows[lbxDeelnemers.SelectedIndex]["checkedin"] = chbCheckedIn.Checked.ToString();

        }

        private void changedeelnemer()
        { 
            
        }



        private void btnSave_Click(object sender, EventArgs e)
        {
            //stuurt aangepaste gegevens naar de database
            UpdateDeelnemer();

            //Code komt van een internet forum het was de oplossing op mijn error van vorige code(begrijp nie precies wat deze doet)
            SqlCommandBuilder cb = new SqlCommandBuilder(daDeelnemers);

            // DataTable opslaan in DataSet
            dsDeelnemers.Tables["deelnemers"].Merge(dtDeelnemers);

            //try dient om niet het programma te sluiten maar verder te kunnen werken
            try
            {
                //dataapter stuurt naar de database de update(getchange stuurt alleen de veranderingen) als geen getchanged zet dan stuurt die helle de tabel
                daDeelnemers.Update(dsDeelnemers, "deelnemers");
                MessageBox.Show(lmLang.GetString("adminUser.errY"));
            }
            catch (Exception)
            {

                MessageBox.Show(lmLang.GetString("adminUser.errN"));
            }



        }

        private void EditUser_Load(object sender, EventArgs e)
        {

        }

        //event die gebeurd bij het veranderen van het selected item , dus het functie loadDeelnemer word dan uitgevoerd 
        private void lbxDeelnemers_SelectedIndexChanged(object sender, EventArgs e)
        {
            LoadDeelnemer();
            
        }

        private void btnNewUser_Click(object sender, EventArgs e)
        {
            //De listbox wordt hide en alle textboxen worden leeg gemaakt
            lbxDeelnemers.Visible = false;
            btnNewUser.Visible = false;
            btnSaveEdit.Visible = false;
            btnSaveAdd.Visible = true;

            txtFirstname.Text = "";
            txtName.Text = "";
            txtUsername.Text = "";
            txtPassword.Text = "";
            chbBetaald.Checked = false;
            chbStaff.Checked = false;
            txtEmail.Text = "";
            cboLanguage.Text = "";
            chbCheckedIn.Checked = false;

            
            
        }

        private void btnSaveAdd_Click(object sender, EventArgs e)
        //IN de datatabel niieuwe rij toevoegen met de nodige gegevens
        {
            dtDeelnemers.Rows.Add(null, txtUsername.Text, txtPassword.Text, txtName.Text, txtFirstname.Text, chbBetaald.Checked, txtCredits.Text, chbStaff.Checked, cboLanguage.Text, txtEmail.Text, chbCheckedIn.Checked);


            //Code komt van een internet forum het was de oplossing op mijn error van vorige code(begrijp nie precies wat deze doet)
            SqlCommandBuilder myBuilder = new SqlCommandBuilder(daDeelnemers);
            myBuilder.GetUpdateCommand();
            daDeelnemers.UpdateCommand = myBuilder.GetUpdateCommand();
            

            //try dient om niet het programma te sluiten maar verder te kunnen werken
            try
            {
                daDeelnemers.Update(dtDeelnemers.GetChanges());
                MessageBox.Show(lmLang.GetString("adminUser.errY"));
            }
            catch (Exception)
            {

                MessageBox.Show(lmLang.GetString("adminUser.errN"));
            }

          
        }
    }
}
